/*这段代码实现了以下功能：

打开源文件和目标文件，使用open函数和文件描述符来进行操作。
使用lseek函数将源文件的读取位置从文件末尾倒退一个偏移量OFFSET。这是为了读取文件的最后一部分内容。
使用read函数从源文件中读取数据，并将数据存储在缓冲区buff中。read函数返回实际读取的字节数。
使用write函数将缓冲区中的数据写入目标文件中。如果写入的字节数与实际读取的字节数不相等，则表示写入出错。
重复步骤3和步骤4，直到源文件的数据被完全读取并写入到目标文件中。
关闭源文件和目标文件，使用close函数释放文件描述符。

该程序的主要功能是将源文件的最后一部分内容复制到目标文件中，偏移量由OFFSET定义。文件的读取和写入是使用缓冲区进行的，缓冲区的大小由BUFFER_SIZE定义。*/

#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>

#define OFFSET 1024          // 从文件末尾倒退的偏移量
#define SRC_FILE "src"       // 源文件名
#define DEST_FILE "dest"     // 目标文件名
#define BUFFER_SIZE 1024     // 缓冲区大小

int main(){
    int src_fd, dest_fd;        // 源文件描述符和目标文件描述符
    unsigned char buff[BUFFER_SIZE];    // 缓冲区
    int real_read_len;          // 实际读取长度

    src_fd = open(SRC_FILE, O_RDONLY);   // 打开源文件，以只读方式打开
    dest_fd = open(DEST_FILE, O_WRONLY|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);  // 打开目标文件，以只写方式打开，如果不存在则创建，已存在则清空内容

    if (src_fd < 0 || dest_fd < 0){
        perror("Open file error");    // 打开文件出错
        exit(1);
    }
    
    printf("src fd:%d, dest fd:%d\n", src_fd, dest_fd);

    if (lseek(src_fd, -OFFSET, SEEK_END) < 0){
        perror("Lseek error");    // 文件偏移出错
        exit(-1);
    }

    while((real_read_len = read(src_fd, buff, sizeof(buff))) > 0){
        if (write(dest_fd, buff, real_read_len) != real_read_len){
            perror("Write file error");    // 写入文件出错
            exit(-1);
        }
    }        

    close(src_fd);    // 关闭源文件
    close(dest_fd);   // 关闭目标文件

    return 0;
}
